// 151. 颠倒字符串中的单词
// 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

// 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

// 注意：输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中，单词间应当仅用单个空格分隔，且不包含任何额外的空格。

// 输入：s = "the sky is blue"
// 输出："blue is sky the"
/**
 * @param {string} s
 * @return {string}
 */
 var reverseWords = function (s) {
    let r = s.length - 1, l = r, res = "";
    while (l >= 0) {
        //先找到单词的尾部
        while (s[r] === " ") {
            r--;
        }
        l = r;
        //给上次单词加空格，排除第一次
        if (l >= 0 && res) {
            res += " ";
        }
        //再找到单词的头部
        while (s[l] && s[l] !== " ") {
            l--;
        }
        //遍历单词并添加
        for (let i = l + 1, j = r; i <= j; i++) {
            res += s[i];
        }
        //跳到下一个单词
        r = l;
    }
    return res;
};

// 解法二
/**
 * @param {string} s
 * @return {string}
 */
 var reverseWords = function (s) {
    let list=s.split(' ');
    let ans='';
    let slow=0,fast=0;
    while(fast<list.length){
        if(list[fast]!==''){//不为空
            list[slow++]=list[fast++];
            // slow++;
        }else
            fast++;
    }
    list.length=slow;//list的长度要重新赋值
    for(let j=list.length-1;j>=0;j--){
        if(j==0) 
            ans+=list[j];
        else
            ans+=list[j]+' ';
    }
    return ans;
};